package com.njts.programming;

import java.util.Arrays;
import java.util.Scanner;

/**
 * @author David GE
 * Date  2025/11/17
 * 某系统的密码，为了安全，需要加密后再传输，加密规则是：对密码中的每位数，
 * 都加5，最后将所有数字顺序反转，得到一串加密后的新数，请设计出满足本需求的加密程序
 */
public class Encryption {
    /*
    * 对称加密  ->明文->密文(流程简单,易破解)
    * 非对称加密:
    *     公钥      暴露风险(劫持)  解密   私钥(根据公钥生成+机器码)
    * A明文 ---> 密文-------> 客户机 B---------->解密----->明文
    *      加密          传输
    * A明文 < ----密文 <-------客户机 B <--------密文 <----明文
    *        私钥                     加密            公钥
    *
    *
    * */
    public static void main(String[] args) {
        // 凯撒加密+取模算法
        System.out.println("请输入您的密码,系统将会为您加密");
        Scanner scanner = new Scanner(System.in);
        String pwd = scanner.next();
        // 字符串转数组
        char[] pwdCharArray = pwd.toCharArray();
        char[] encryptPwd = encryption(pwdCharArray);
        System.out.println("原来的密文是:"+pwd);
        System.out.println("加密后的密文是:"+ Arrays.toString(encryptPwd));
        decrypt(encryptPwd);
        System.out.println("解密后的密文是:"+new String(encryptPwd));

    }
    public static  char[] encryption(char [] pwd){
        for (int i = 0; i < pwd.length; i++) {
            pwd[i]=(char)((pwd[i]+5));// 偏移五个位置
        }
        reverse(pwd);
        return pwd;
    }
    // 解密
    public static void decrypt(char[] pwd){
        for (int i = 0; i < pwd.length; i++) {
            pwd[i]=(char)((pwd[i]-5));// 偏移五个位置
        }
        reverse(pwd);

    }
    public static void reverse(char [] data){
        // 反转后 [50, 40, 30, 20, 10]
        // 折半对调
        // 终止条件:对称轴下标:length/2
        for (int i = 0; i <data.length/2 ; i++) {
            // 对调以对称轴的下标为界的左右两边的数
            // 分析 i 0  j length-1-0
            //     i 1   j length-1-1
            //     i 2   j length -i-2

            //    i  k   j  length-1-k
            ///   i  i   length-1-i;
            char temp =data[i];
            data[i]=data[data.length-1-i];
            data[data.length-1-i]=temp;


        }
    }
}
